home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
PROGSCAL
/
TBUTIL2.LZH
/
SIDEWYTR.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-08-28
|
6KB
|
182 lines
PROGRAM sideways(INPUT,OUTPUT,infile);
{COPYRIGHT @ 1983
Jim Holtman
35 Dogwood Trail
Randolph, NJ 07869
(201) 361-3396}
{ Modified for Turbo Pascal by Jeff Firestone. August, 1984. }
{This program will print the `infile' sideways on an EPSON MX-80 Printer.
It makes use of the characters in the PC's ROM for the graphics mode of
the CRT. The characters in the file are `looked up' and then the graphics
mode of the printer is used for output.}
{ The DEBUG statements will output on the CRT the current line being printed.
The line will appear vertically. }
TYPE
CHAR_PER_LINE = 0..1999; { Maximum input line size }
vstr = ARRAY[0..1999] OF CHAR;
ROM_ARRAY = ARRAY[0..32000] OF CHAR;
Strng = STRING[20];
CONST
EOFL = #26; { TEXT EOF character }
EOL = #13;
TAB = #9; { expand TABs }
MAX_LINES = 48; { Lines/Page }
MAX_LINES1 = 49; { MAXLINES + 1 }
SPACES_PER_LINE = 2; { 2/72th inch space between lines }
SPACES_PER_LETTER = 8; { DOT size of characters }
VAR
lptr : ARRAY[1..MAX_LINES] OF ^vstr; { input lines }
inbuf : ARRAY[CHAR_PER_LINE] OF CHAR;
linesize : CHAR_PER_LINE;
indx : 0..MAX_LINES;
line : 0..MAX_LINES1;
infile : FILE OF CHAR;
printer : TEXT;
col : CHAR_PER_LINE;
pchar : INTEGER;
ichar : 0..7;
max : CHAR_PER_LINE;
rom : ^ROM_ARRAY;
inchar : CHAR;
name : Strng;
ignore : SET OF #0..#$FF;
{--- 1 --------------------------------------------------------------}
PROCEDURE Greetings;
BEGIN
GOTOXY(26,1);
WRITELN('SIDEWAYS FOR TURBO PASCAL');
WRITELN; WRITELN;
WRITELN('SideWays prints the file you specify sidewise on you Epson printer.');
WRITELN('This program is useful for printing spreadsheet PRINT files which are');
WRITELN('too wide to be printed in the normal manner.');
END;
{--- 2 --------------------------------------------------------------}
PROCEDURE PRINT_CHAR(pchar : INTEGER);
BEGIN
pchar := pchar * 8;
FOR ichar := 7 DOWNTO 0 DO {Pickup character, a line at a time, }
WRITE(printer,rom^[pchar+ichar]); {from ROM}
FOR ichar := 1 TO SPACES_PER_LINE DO
WRITE(printer, #0);
END;
{--- 1 --------------------------------------------------------------}
PROCEDURE SEND_TO_PRINTER;
BEGIN
WRITELN(OUTPUT,'line=',line,' max=',max); {--DEBUG--}
IF inchar <> EOFL THEN
line := MAX_LINES
ELSE line := line-1;
FOR col := 1 TO max DO
BEGIN { Output collected lines }
WRITE(printer,#27 + 'A' + CHR(SPACES_PER_LETTER) + #27 + 'K',
CHR((line*(8+SPACES_PER_LINE)) MOD 256),
CHR((line*(8+SPACES_PER_LINE)) DIV 256));
FOR indx := line DOWNTO 1 DO
BEGIN { Scan next column }
{if column pointer is larger than string, output BLANK}
IF col > ORD(lptr[indx]^[0]) THEN
pchar := ORD(' ')
ELSE
pchar := ORD(lptr[indx]^[col]);
WRITE(OUTPUT,CHR(pchar)); {--DEBUG--}
PRINT_CHAR(pchar);
END; { FOR indx := line DOWNTO 1 DO }
WRITELN(printer);
WRITELN(OUTPUT);{--DEBUG--}
END; { FOR col := 1 TO max DO }
WRITELN(printer);
WRITELN(OUTPUT);{--DEBUG--}
FOR indx := 1 TO line DO DISPOSE(lptr[indx]); {Free up space on HEAP}
WRITE(printer, #12);
END;
{--- 1 --------------------------------------------------------------}
PROCEDURE READ_IN_THE_FILE;
LABEL break;
BEGIN
IF inchar = EOL THEN
BEGIN {check for End-of-Line}
inbuf[0]:= CHR(LO(linesize));
inbuf[1]:= CHR(HI(linesize));
GetMem(lptr[line], linesize+1); { allocate string storage }
MOVE(inbuf[0], lptr[line]^, (linesize+1)); { save }
IF linesize > max THEN max := linesize;
linesize := 1;
line := line+1;
READ(infile, inchar);
WRITELN(OUTPUT,'<<'); {--DEBUG--}
GOTO break;
END;
IF inchar = EOFL THEN GOTO break;
IF NOT(inchar IN IGNORE) THEN
BEGIN
IF inchar = TAB THEN
REPEAT {Expand TABs}
linesize := linesize+1;
inbuf[linesize] := ' ';
UNTIL (linesize MOD 8) = 0
ELSE BEGIN
linesize := linesize+1;
inbuf[linesize] := inchar;
END; { ELSE }
WRITE(OUTPUT,inchar);{--DEBUG--}
END; { IF NOT(inchar IN IGNORE) }
READ(infile, inchar);
break:
END;
{--------------------------------------------------------------------}
BEGIN
IGNORE:= [#0..#8,#10..#$1f,#$80..#$FF];
{NOTE!!!!
The following declarations define the segment and offset values
for the characters in the PC version of the ROM. For the XT, check
the TECH MANUAL for the correct values.}
MEMW[SEG(rom):OFS(rom)+2]:= $F000; {seg addr of the CRT char generation}
MEMW[SEG(rom):OFS(rom)] := $FA6E; {OFS address of matrix in the ROM --
for non-XT versions of PC}
Greetings; Writeln; Writeln;
WRITE('What file would you like to print SideWays : ');
READLN(name);
ASSIGN(printer,'lpt1:'); { Open the printer }
ASSIGN(infile,name);
REWRITE(printer);
RESET(infile);
READ(infile, inchar);
REPEAT
max := 0;
linesize := 1;
line := 1;
WHILE (line <= MAX_LINES) AND (inchar <> EOFL) DO
READ_IN_THE_FILE;
SEND_TO_PRINTER;
UNTIL inchar = EOFL;
END.